/**
  ******************************************************************************
  * @file    main.c
  * @author  ashuai0110
  * @version V1.0
  * @date    2024-01-28
  * @brief   使用举例-软件定时器
  *
  ******************************************************************************
  * @attention
  *
  * 版权声明:内容为编者(ashuai0110)原创,使用请注明出处,当然,你也可以不这样做^_^
  * 出处链接:https://gitee.com/ashuai0110/mcu_reuse_development_module
  *
  ******************************************************************************
  */

/* 包含头文件-----------------------------------------------------------------*/
#include "stm32f10x.h"
#include "gpio.h"
#include "tim.h"

#include "timer_software.h"

/* 私有宏定义-----------------------------------------------------------------*/

/* 私有类型定义---------------------------------------------------------------*/

/* 私有变量-------------------------------------------------------------------*/
static timer_s_t ledBlinkTimerS; /* led闪烁任务 */
static timer_s_t printTimerS;    /* 打印任务 */

/* 全局变量-------------------------------------------------------------------*/

/* 私有函数原型---------------------------------------------------------------*/

/**
  * @brief  定时器1中断函数
  *
  * @param  None
  *
  * @retval None
  */
void TIM1_UP_IRQHandler(void)
{
    if(TIM_GetITStatus(TIM1, TIM_IT_Update) != RESET) 
    {
        /* 组件计时节拍接口 */
        module_tick_inc(1);
        
        TIM_ClearITPendingBit(TIM1, TIM_FLAG_Update);
    }
}

/**
  * @brief  led闪烁任务回调函数
  *
  * @param  None
  *
  * @retval None
  */
void led_blink_callback(void)
{
    gpio_toggle(LED_RUN);
}

/**
  * @brief  打印任务回调函数
  *
  * @param  None
  *
  * @retval None
  */
void print_callback(void)
{
    DEBUG_LOG("print task");
}

/**
  * @brief  main
  */
int main(int argc, char *argv[])
{
    VERSION_LOG("example-timer_software", 1, 0, 0);
    
    /* led初始化 */
    gpio_init_config();
    /* 定时器初始化 1ms */
    tim1_init_config(100-1, 720-1);
    
    uint8_t ret = 0;
    /* 软件定时器初始化 */
    /* led闪烁任务 500ms周期 */
    ret = timer_s_init(&ledBlinkTimerS, 500, led_blink_callback, TIMER_RUN_START);
    if(RET_OK != ret) { ERROR_LOG("timer_s_init failure"); }
    /* 打印任务 1000ms周期 */
    ret = timer_s_init(&printTimerS, 1000, print_callback, TIMER_RUN_START);
    if(RET_OK != ret) { ERROR_LOG("timer_s_init failure"); }
    
    while(1)
    {
        /* 软件定时器轮询处理 */
        timer_s_poll();
    }
}

